package com.ipartek.migracion.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

import com.ipartek.migracion.bean.Persona;
import com.ipartek.migracion.factoria.MySqlDAOFactory;
import com.ipartek.migracion.interfaces.InterfacePersonaDAO;
import com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException;

public class MySqlPersonaDAO implements InterfacePersonaDAO {

	private static Logger log = Logger.getLogger(MySqlPersonaDAO.class);

	@Override
	public Persona getPersonaById(int alumnoId, String nombreTabla)
			throws Exception {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public ArrayList<Persona> getPersonas(String nombreTabla) throws Exception {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public boolean addListPersonas(ArrayList<Persona> listaPersonas,
			String nombreTabla) {

		PropertyConfigurator.configure("config/log4j.properties");

		boolean resultado = false;
		Connection conexion = null;
		StringBuffer sql = null;
		try {
			sql = new StringBuffer();
			sql.append("INSERT INTO "
					+ nombreTabla
					+ " (nombre,apellido1,apellido2,edad,email,dni,rol) VALUES (?,?,?,?,?,?,?);");
			conexion = MySqlDAOFactory.conectar();

			// Poner Autocommit a false
			conexion.setAutoCommit(false);

			// Proceso de migracion hacer iterador de la lista de personas he
			// insertar cada persona como un registro
			Iterator<Persona> it = listaPersonas.iterator();
			Persona user;
			PreparedStatement stmt = conexion.prepareStatement(sql.toString());

			while (it.hasNext()) {
				user = it.next();
				// Preparar la query
				stmt.setString(1, user.getNombre());
				stmt.setString(2, user.getApellido1());
				stmt.setString(3, user.getApellido2());
				stmt.setInt(4, user.getEdad());
				stmt.setString(5, user.getEmail());
				stmt.setString(6, user.getDni());
				stmt.setString(7, user.getRol().toString());
				stmt.executeUpdate();
			}

			conexion.commit();

			log.info("Transaction commit...");
			System.out.println("Transaction commit...");

			resultado = true;
		} catch (MySQLIntegrityConstraintViolationException e) {
			log.warn("Entrada duplicada de DNI");
			System.out
					.println("Entrada duplicada en DNI MySQLIntegrityConstraintViolationException");
		}

		catch (SQLException e) {
			// Si es excepcion por entrada duplicada
			if (e.getErrorCode() == 1062) {
				System.out.println("Entrada duplicada en DNI SQLEXCEPTION");
			}

			else {
				if (conexion != null) {
					// En caso de Fallo
					try {
						conexion.rollback();
						log.warn("Connection rollback...");
						System.out.println("Connection rollback...");
					} catch (SQLException e1) {
						e1.printStackTrace();
					}

				}
				e.printStackTrace();
			}

		} catch (Exception e) {
			// Utilidades.logsPersona("Fallo excepcion :" + e.getMessage(),
			// Utilidades.WARNING, log);
		} finally {
			try {
				if (conexion != null && !conexion.isClosed()) {
					conexion.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

		return resultado;
	}

	// Metodos CRUD
	@Override
	public boolean deletePersona(Integer idPersona) throws Exception {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean addPersona(Persona user, String nombreTabla)
			throws Exception {
		boolean resultado = false;
		Connection conexion = null;
		StringBuffer sql = null;
		try {
			sql = new StringBuffer();
			sql.append("INSERT INTO "
					+ nombreTabla
					+ " (nombre,apellido1,apellido2,edad,email,dni,rol) VALUES (?,?,?,?,?,?,?);");
			conexion = MySqlDAOFactory.conectar();
			// Preparar la query
			PreparedStatement stmt = conexion.prepareStatement(sql.toString());
			stmt.setString(1, user.getNombre());
			stmt.setString(2, user.getApellido1());
			stmt.setString(3, user.getApellido2());
			stmt.setInt(4, user.getEdad());
			stmt.setString(5, user.getEmail());
			stmt.setString(6, user.getDni());
			stmt.setString(7, user.getRol().toString());

			stmt.executeUpdate();
			resultado = true;
		} catch (Exception ex) {
			throw ex;
		} finally {
			MySqlDAOFactory.desconectar(conexion);
		}
		return resultado;
	}

	@Override
	public boolean updatePersona(Persona user) {
		// TODO Auto-generated method stub
		return false;
	}

}
